package com.atdel.demo33;


import java.lang.reflect.Field;
import java.util.List;

/**
 * @BelongsProject: java_study
 * @BelongsPackage: com.atdel.demo32
 * @Author: Del
 * @CreateTime: 2025-03-30  17:08
 * @Description: 抽象的 饲养员类
 * @Version: 1.0
 */
public abstract class Keeper<T extends Animal> {
    // 饲养员姓名
    private String name;
    // 饲养的动物
    private List<T> animals;

    // 构造方法，初始化饲养员姓名和饲养的动物列表
    public Keeper(String name, List<T> animals) {
        this.name = name;
        this.animals = animals;
    }

    /**
     * 喂养动物的方法
     * 饲养员遍历动物列表，调用每个动物的eat方法
     */
    public void feed() {
        System.out.println(name + " 开始喂养动物:");
        for (T animal : animals) {
            System.out.print("  - ");
            animal.eat();
        }
    }

    /**
     * 巡查动物睡眠情况的方法
     * 饲养员遍历动物列表，检查每个动物的睡眠状态，并根据状态给出相应的处理意见
     */
    public void patrol() {
        System.out.println(name + " 开始巡查动物睡眠情况:");
        for (T animal : animals) {
            try {
                Field sleepField = Animal.class.getDeclaredField("sleepStatus");
                SleepStatus sleepAnnotation = sleepField.getAnnotation(SleepStatus.class);

                if (sleepAnnotation != null) {
                    if (animal.getSleepStatus() == SleepStatus.Status.INSOMNIA) {
                        System.out.println("  - " + animal.getName() + " 睡眠不好，需要服用安眠药");
                    } else {
                        System.out.println("  - " + animal.getName() + " 睡眠良好");
                    }
                }
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 检查动物健康状况的方法
     * 饲养员遍历动物列表，检查每个动物的健康状态，并根据状态给出相应的处理意见
     */
    public void healthCheck() {
        System.out.println(name + " 开始检查动物健康状况:");
        for (T animal : animals) {
            try {
                Field healthField =     Animal.class.getDeclaredField("healthStatus");
                HealthStatus healthAnnotation = healthField.getAnnotation(HealthStatus.class);

                if (healthAnnotation != null) {
                    System.out.print("  - " + animal.getName() + " 健康状况: " + animal.getHealthStatus());
                    if (animal.getHealthStatus() == HealthStatus.Status.POOR) {
                        System.out.println(" (需要特别照看)");
                    } else {
                        System.out.println();
                    }
                }
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        }
    }

    // 获取饲养员姓名的方法
    public String getName() {
        return name;
    }

    // 获取饲养的动物列表的方法
    public List<T> getAnimals() {
        return animals;
    }
}
